202511262222 unix socket 与传统的 tcp 本地通信的异同

202511262222 unix socket 与传统的 tcp 本地通信的异同

在同一台机器里,Unix Socket本地 TCP(127.0.0.1) 都能让两个进程把信息塞进内核,然后再被对方捞出来。但它们的“路径”和“行李检查”不太一样——一个像是走家里的侧门,一个像是走正式大门。

聊聊两者差异时,最好从原理出发,避免落入“因为更快所以更快”这种循环论。下面按特性说清楚:


核心相同点(都是内核里的高速通道)

两者都属于 本地 IPC(进程间通信),数据不会离开本机,不会上网,也不会经过物理网卡。

它们都经历:

  1. 用户态 → 内核态
  2. 内核缓冲区里传数据
  3. 内核态 → 用户态

所以带宽最终也都受制于 CPU、内存带宽、内核协议栈效率,而不是网卡。


关键差异

1. 协议栈层级不同:TCP 比 Unix Socket 多走一大圈

TCP(即便是 127.0.0.1)依然遵守完整 TCP/IP 协议栈:

Unix Socket 则直接在内核里 内存结构体对拷,完全没有报文封装。

结果是:

一个更形象的说法:

TCP 即便在家里走路也要“戴头盔、过安检、检查车票”。
Unix Socket 则是“直接从客厅走到厨房”。


2. 带宽:Unix Socket 一般更高

本地 TCP 的最大带宽常见在 5–12 GB/s
Unix Socket 常见能达到 10–20+ GB/s

这不是固定值,要看内核版本和 CPU 架构,但整体趋势是:


3. 文件系统 vs 端口

Unix Socket 用文件路径 /var/run/redis.sock 来表示。
TCP 用端口 127.0.0.1:6379

影响:


4. 可扩展性:TCP 更强

Unix Socket:

TCP:

如果将来服务要横向扩展到多机,Unix Socket 就完全没法用了。


5. 连接建立成本

TCP:三次握手
Unix Socket:直接建立进程间管道

影响是:


6. 调试工具不同

TCP:tcpdump、ss、netstat 都能看
Unix Socket:只能看 ss -x、lsof


什么时候应该用谁?

尽量用 Unix Socket 的场景

Reddit、Stack Overflow、Redis 官方文档都强调:
本地通信优先 unix socket,性能差距可达 30%+


必须用 TCP 的场景


小结(简洁版)